package com.qq.文件_io_字符.io.字节流;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;

/*
	需求：将某个磁盘的文件夹拷贝到另一个文件夹下去，包括文件夹中的全部信息
	
创建文件对象构造方法：
public File​(String pathname)				根据文件路径创建文件对象
public File​(String parent, String child)	根据父路径名字符串和子路径名字符串创建文件对象
public File​(File  parent, String child)		根据父路径对应文件对象和子路径名字符串创建文件对象

*/

public class CopyDir_Test {
	public static void main(String[] args) {
		File dir1 = new File("D:\\JAVA学习\\乱七八糟\\文件操作\\源文件\\haha");
		File dir2 = new File("D:\\JAVA学习\\乱七八糟\\文件操作\\目标文件");
		copydir(dir1,dir2);

	}
	
	public static void copydir(File dir1 ,File dir2){
		if(dir1!= null){//1.创建了文件对象
			if(dir1.isFile()){//如果dir1是文件
				copyFile(dir1,new File(dir2,dir1.getName()));
							//流只能完成文件和文件之间的数据传输
				return;
			}
			//dir1是文件夹
			if (dir1.exists()) {	//根据父路径对应文件对象和子路径名字符串创建文件对象
				File dir3 = new File(dir2,dir1.getName());
				dir3.mkdirs();
				File[] files = dir1.listFiles();
				if(files != null ){//有权限访问,且存在该文件夹
					for(File file : files){
						if(file.isFile()){		//根据父路径对应文件对象和子路径名字符串创建文件对象
							copyFile(file,new File(dir3,file.getName()));
						}else{
							copydir(file,dir3);	
						}
							
					}
					System.out.println("文件夹"+dir1+"复制成功");
					
				}else{
					System.out.println("没有权限访问"+dir1+"无法复制里面的文件");
				}
			}else{
				System.out.println("不存在"+dir1);
			}
			
		}else{
			System.out.println("没有创建文件对象");
		}
	}
	
public static void copyFile(File dir1 ,File dir2){
    try (
    		InputStream is = new FileInputStream(dir1);
    		OutputStream os = new FileOutputStream(dir2);
//    	注：只能通过”文件路径对象“或”文件路径名称“创建流，不能像文件对象那样，通过父路径和子路径创建
//    	如果要描述一个父路径和子路径结合，可以这样描述：dir2+"\\"+dir1.getName()
        ) {

    //定义一个字节数组转移数据
    byte[] buffer = new byte[1024];
    int len; // 记录每次读取的字节数。
    while ((len = is.read(buffer)) != -1){
        os.write(buffer, 0 , len);
    }
} catch (Exception e){
    e.printStackTrace();
    }
    
    System.out.println("文件"+dir1+"复制成功");

}

}
